import os
import time
import logging
import colorlog
import sys
import logging.config
from Common.plugs.get_config import r_config

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))

if sys.platform == "win32":
    conf_dir = os.path.join(BASE_DIR, 'Common/config/config.ini').replace('/', '\\')
else:
    conf_dir = os.path.join(BASE_DIR, 'Common/config/config.ini')
log_path = r_config(conf_dir, "log", "log_path")
log_name = f"{time.strftime('%Y-%m-%d')}.log"  # 定义日志文件名称

log_colors_config = {
    'DEBUG': 'white',  # cyan white
    'INFO': 'green',
    'WARNING': 'yellow',
    'ERROR': 'red',
    'CRITICAL': 'bold_red',
}


class Log(object):
    """日志模块"""

    def __init__(self):
        # 创建日志对象
        self.logger = logging.getLogger()
        # 日志输出等级
        self.logger.setLevel(logging.DEBUG)
        # 文件的命名
        self.log_path = os.path.join(log_path, f"{time.strftime('%Y%m%d_%H')}.log")
        # 日志输出格式
        self.file_formatter = logging.Formatter(
            fmt='[%(asctime)s] -[%(name)s:%(lineno)d]- %(filename)s-[%(module)s:%(funcName)s] - [%(levelname)s]-%(message)s',
            datefmt='%Y-%m-%d  %H:%M:%S',
        )
        self.console_formatter = colorlog.ColoredFormatter(
            # fmt='%(log_color)s[%(asctime)s] - %(filename)s - %(levelname)s: %(message)s',
            fmt='%(log_color)s[%(asctime)s] -[%(name)s:%(lineno)d]- %(filename)s-[%(module)s:%(funcName)s][%(levelname)s]-%(message)s',
            datefmt='%Y-%m-%d  %H:%M:%S',
            log_colors=log_colors_config
        )

    def console(self, level, message):
        # 创建一个FileHandler,用于写到本地
        fh = logging.FileHandler(self.log_path, 'a', encoding='utf-8')
        fh.setFormatter(self.file_formatter)
        self.logger.addHandler(fh)
        # 创建一个StreamHandler,用于输出到控制台
        ch = logging.StreamHandler()
        ch.setFormatter(self.console_formatter)
        self.logger.addHandler(ch)
        if level == "info":
            self.logger.info(message)
        elif level == "debug":
            self.logger.debug(message)
        elif level == "warning":
            self.logger.warning(message)
        elif level == "error":
            self.logger.error(message)
        elif level == "critical":
            self.logger.critical(message)
        # 这两行代码是为了避免日志输出重复问题
        self.logger.removeHandler(ch)
        self.logger.removeHandler(fh)
        # 关闭打开的文件
        fh.close()
        ch.close()

    def debug(self, message):
        self.console("debug", message)

    def info(self, message):
        self.console("info", message)

    def warning(self, message):
        self.console("warning", message)

    def error(self, message):
        self.console("error", message)

    def critical(self, message):
        self.console("critical", message)


class SuperLog(object):
    def __init__(self):
        # 定义日志输出格式
        self.standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][logger:%(name)s][%(filename)s:%(lineno)d][%(module)s:%(funcName)s][%(levelname)s]:%(message)s'
        self.simple_format = '[%(asctime)s][%(filename)s:%(lineno)d][%(module)s:%(funcName)s][%(levelname)s]:%(message)s'
        self.common_format = '[%(asctime)s][%(levelname)s]--%(message)s'
        # 定义日志输出目录
        self.logfile_dir = log_path

    def logger(self, file_name='default'):
        # 判断一下路径存在不存在
        if not os.path.isdir(self.logfile_dir):
            os.makedirs(self.logfile_dir)
        logfile_path = os.path.join(self.logfile_dir, log_name)
        # log 配置字典
        log_dic = {
            'version': 1,
            'disable_existing_loggers': False,
            'formatters': {
                'standard': {
                    'format': self.standard_format,
                },
                'simple': {
                    'format': self.simple_format
                },
                'common_format': {
                    'format': self.common_format
                },
            },
            'filters': {},
            'handlers': {
                # 打印到终端的日志
                'console': {
                    'level': 'DEBUG',
                    'class': 'logging.StreamHandler',  # 打印到屏幕(控制台)
                    'formatter': 'simple'
                },
                # 打印到文件的日志
                'file': {
                    'level': 'DEBUG',  # 最低日志等级
                    'class': 'logging.handlers.RotatingFileHandler',  # 保存文件 ,轮寻模式
                    'formatter': 'standard',  # 定义使用哪种格式
                    'filename': logfile_path,  # 日志的文件路径
                    'maxBytes': 1024 * 1024 * 5,  # 日志大小5M
                    'backupCount': 5,
                    'encoding': 'utf-8',  # 日志文件的编码
                },
            },
            'loggers': {
                # 定义不同的logger对象，通过logging.getLogger(日志对象名称)，如：logger.my_log("console")
                'console': {
                    'handlers': ['console'],  # 这里是将从定义好的两个handler中选择一个console对象添加上,即log数据中打印到控制台
                    'level': 'DEBUG',
                    'propagate': True  # 向上（更高level的logger）传递
                },
                'default': {
                    'handlers': ['console', 'file'],  # 这里是将定义好的两个handler对象都添加上,即log数据既写入文件又打印到控制台
                    'level': 'DEBUG',
                    'propagate': True  # 向上（更高level的logger）传递
                },
            },
        }
        logging.config.dictConfig(log_dic)  # 导入上面的定义的logging的配置
        return logging.getLogger(file_name)  # 生成并返回一个log对象


logger = SuperLog().logger()
if __name__ == "__main__":
    # logger = SuperLog().logger()
    logger.info("这是一个日志信息xxxxxxxxxxxxxxxxxxxxxx")
    logger.debug("这是一个日志信息xxxxxxxxxxxxxxxxxxxxxx")
